package api

import (
	"github.com/imroc/req/v3"
	"github.com/pkg/errors"
	"stock/server/internal/pkg/stock/typeutil"
	"strings"
	"time"
)

type XueQiu struct{}

type RealtimeResp struct {
	Data []struct {
		Symbol             string      `json:"symbol"`               // 代码 SH000001
		Current            float64     `json:"current"`              // 当前价格
		Percent            float64     `json:"percent"`              // 涨跌幅
		Chg                float64     `json:"chg"`                  // 涨跌额
		Timestamp          int64       `json:"timestamp"`            // 时间戳 毫秒
		Volume             float64     `json:"volume"`               // 成交量
		Amount             float64     `json:"amount"`               // 成交额
		MarketCapital      float64     `json:"market_capital"`       // 总市值
		FloatMarketCapital float64     `json:"float_market_capital"` // 流通市值
		TurnoverRate       float64     `json:"turnover_rate"`        // 换手率
		Amplitude          float64     `json:"amplitude"`            //	振幅
		Open               float64     `json:"open"`                 // 开盘价
		LastClose          float64     `json:"last_close"`           // 昨收价
		High               float64     `json:"high"`                 // 最高价
		Low                float64     `json:"low"`                  // 最低价
		AvgPrice           float64     `json:"avg_price"`            // 均价
		TradeVolume        interface{} `json:"trade_volume"`         // 成交量
		Side               interface{} `json:"side"`                 // 买卖方向
		IsTrade            bool        `json:"is_trade"`             // 是否交易
		Level              int         `json:"level"`                // 交易级别
		TradeSession       interface{} `json:"trade_session"`        // 交易时间段
		TradeType          interface{} `json:"trade_type"`           // 交易类型
		CurrentYearPercent float64     `json:"current_year_percent"` // 年初至今涨跌幅
		TradeUniqueID      interface{} `json:"trade_unique_id"`      // 交易唯一ID
		Type               int         `json:"type"`                 // 类型
		BidApplSeqNum      interface{} `json:"bid_appl_seq_num"`     // 买方委托序号
		OfferApplSeqNum    interface{} `json:"offer_appl_seq_num"`   // 卖方委托序号
		VolumeExt          interface{} `json:"volume_ext"`           // 成交量扩展
		TradedAmountExt    interface{} `json:"traded_amount_ext"`    // 成交额扩展
		TradeTypeV2        interface{} `json:"trade_type_v2"`        // 交易类型V2
		YieldToMaturity    interface{} `json:"yield_to_maturity"`    // 到期收益率
	} `json:"data"`
	ErrorCode        int    `json:"error_code"` // 没啥用
	ErrorDescription string `json:"error_description"`
}

func (o XueQiu) Realtime(codes []Code) (map[string]typeutil.Kline, error) {
	// 组装参数
	var codeIds []string
	for _, code := range codes {
		codeIds = append(codeIds, strings.ToUpper(code.Exchange)+code.Symbol) // sh => SH
	}

	body, err := req.DefaultClient().R().SetQueryParam("symbol", strings.Join(codeIds, ",")).Get("https://stock.xueqiu.com/v5/stock/realtime/quotec.json")
	if err != nil {
		return nil, errors.WithMessage(err, "请求雪球实时数据失败")
	}

	var resp RealtimeResp
	err = body.UnmarshalJson(&resp)
	if err != nil {
		return nil, errors.WithMessage(err, "解析雪球实时数据失败")
	}

	if len(resp.Data) == 0 {
		return nil, nil
	}

	var klineMap = make(map[string]typeutil.Kline, len(resp.Data))
	for _, item := range resp.Data {
		code := strings.ToLower(item.Symbol)
		klineMap[code] = typeutil.Kline{
			Symbol:              code,
			Timestamp:           time.Unix(item.Timestamp/1000, 0),
			OpenPrice:           item.Open,
			ClosePrice:          item.Current,
			YesterdayClosePrice: item.LastClose,
			HighPrice:           item.High,
			LowPrice:            item.Low,
			AvgPrice:            item.AvgPrice,
			TradeVolume:         item.Volume,
			TradeAmount:         item.Amount,
			IncreasePercentage:  item.Percent,
			Amplitude:           item.Amplitude,
			TurnoverRate:        item.TurnoverRate,
		}
	}

	return klineMap, nil
}

// AT_83htYf8msNXBinI0ch58XgoGHGaOEREh
func (o XueQiu) Minute(minute int, codes []Code) (map[string][]typeutil.Kline, error) {
	//TODO implement me
	panic("implement me")
}
